home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / FPSE_src / system / amiga / plugin / gpu / gpudma.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-01  |  2.9 KB  |  121 lines

  1. #include "gpulocal.h"
  2.  
  3. int px,py,x_start,y_start,x_end,y_end;
  4. UINT16 *pvram;
  5. UINT8 inTrans, toUpdate;
  6.  
  7. static void dma_chain(UINT32 addr)
  8. {
  9.     do {
  10.         addr &= 0x1FFFFF;
  11.         {
  12.             UINT32 *ptr = (UINT32*)&ram[addr];
  13.             UINT32 data = SWAP32(*ptr++);
  14.             int size = data>>24;
  15. #ifdef MSB_FIRST
  16.             UINT32 buf[256];
  17.             int i;
  18.             for (i=0; i<size; i++) {
  19.               buf[i] = SWAP32(*ptr++);
  20.             }
  21.             ptr = buf;
  22. #endif
  23.             while (size) {
  24.                 int primsize;
  25.                 primsize = do_prim(ptr);
  26.                 ptr  += primsize;
  27.                 size -= primsize;
  28.             }
  29.             addr = data&0xffffff;
  30.         }
  31.         if (addr==0) { /*stop=1;*/ break; }
  32.     } while(addr != 0xffffff);
  33. }
  34.  
  35. static void dma_mem2vram(UINT32 *ptr,int size)
  36. {
  37. #ifdef MSB_FIRST
  38.     UINT32 *buf;
  39.     int i;
  40.  
  41.     buf = (UINT32 *)malloc(size*4);
  42.     for (i=0; i<size; i++) {
  43.       buf[i] = SWAP32(*ptr++);
  44.     }
  45.     ptr = buf;
  46. #endif
  47.     while(size) {
  48.         if (inTrans) {
  49.             while (size--) {
  50.                 UINT32 data = *ptr++;
  51.                 if (px<1024 && py<512)
  52.                     pvram[px] = data;
  53.                 if (++px>=x_end) {
  54.                     px = x_start;
  55.                     pvram += 1024;
  56.                     if (++py>=y_end) {
  57.                         inTrans = 0;
  58.                         break;
  59.                     }
  60.                 }
  61.                 if (px<1024 && py<512)
  62.                     pvram[px] = data>>16;
  63.                 if (++px>=x_end) {
  64.                     px = x_start;
  65.                     pvram += 1024;
  66.                     if (++py>=y_end) {
  67.                         inTrans = 0;
  68.                         break;
  69.                     }
  70.                 }
  71.             }
  72.             if (inTrans==0) {
  73.                 vramchange(x_start,y_start,x_end,y_end);
  74.             }
  75.         } else {
  76.             int primsize;
  77.             primsize = do_prim(ptr);
  78.             ptr  += primsize;
  79.             size -= primsize;
  80.         }
  81.     }
  82. }
  83.  
  84. static void dma_vram2mem(UINT16 *ptr,int size)
  85. {
  86.      size*=2;
  87.      do {
  88.                 if (px<1024 && py<512)
  89.                     *ptr++ = pvram[px];
  90.           if (++px>=x_end) {
  91.                px = x_start;
  92.                pvram += 1024;
  93.                if (++py>=y_end) {
  94.                     inTrans = 0;
  95.                     break;
  96.                }
  97.           }
  98.      } while (--size);
  99. }
  100.  
  101. void GPU_DmaExec(UINT32 adr,UINT32 bcr,UINT32 chcr)
  102. {
  103.     UINT32 size = (bcr>>16)*(bcr&0xffff);
  104.  
  105.     switch(chcr){
  106.     case 0x01000200:
  107.         dma_vram2mem((void*)&ram[adr&0x1fffff],size);
  108.         break;
  109.     case 0x01000201:
  110.         dma_mem2vram((void*)&ram[adr&0x1fffff],size);
  111.         break;
  112.     case 0x01000401:
  113.         dma_chain(adr&0x1fffff);
  114.         break;
  115.     case 0x00000200:
  116.     case 0x00000201:
  117.     case 0x00000401: // disable dma
  118.         break;
  119.     default: printf("gpudma unknown %08x\n",(int)chcr);
  120.     }
  121. }